import type { ButtonProps, ElTooltipProps, PopconfirmProps } from "element-plus";

interface ActionProps extends ButtonProps {
  onClick?: Fn;
  label?: string;
  icon?: string;
  popConfirm?: Partial<PopConfirm>;
  divider?: boolean;
  // 权限编码控制是否显示
  auth?: string;
  // 业务控制是否显示
  ifShow?: boolean;
  tooltip?: string | Partial<ElTooltipProps>;
}
export type ActionItem = Partial<ActionProps>;

export interface PopConfirm extends PopconfirmProps {
  title: string;
  onConfirm: Fn;
  onCancel?: Fn;
}

export type BreakPoint = "xs" | "sm" | "md" | "lg" | "xl";

import { Component, VNode } from "vue";
import type { TableColumnCtx } from "element-plus";
import { ComType } from "@/components/Form/type";
export interface EnumProps {
  label?: string; // 选项框显示的文字
  value?: string | number | boolean | any[]; // 选项框值
  type?: "success" | "info" | "warning" | "danger" | "";
  color?: string;
}

export type SearchRenderScope = {
  searchParam: { [key: string]: any };
  placeholder: string;
  clearable: boolean;
  options: EnumProps[];
  data: EnumProps[];
};

export type SearchProps = {
  el?: string; // 当前项搜索框的类型
  elProps?: any; // 搜索项参数，根据 element plus 官方文档来传递，该属性所有值会透传到组件
  key?: string; // 当搜索项 key 不为 prop 属性时，可通过 key 指定
  order?: number; // 搜索项排序（从大到小）
  render?: (scope: SearchRenderScope) => VNode; // 自定义搜索内容渲染（tsx语法）
} & Record<BreakPoint, number>;

export type FieldNamesProps = {
  label: string;
  value: string;
  children?: string;
};

export type RenderScope<T> = {
  row: T;
  $index: number;
  column: TableColumnCtx<T>;
  [key: string]: any;
};

export type HeaderRenderScope<T> = {
  $index: number;
  column: TableColumnCtx<T>;
  [key: string]: any;
};

interface TableColumnProps<T = any> extends TableColumnCtx<T> {
  isShow?: boolean; // 是否显示在表格当中
  search?: Partial<SearchProps> | undefined; // 搜索项配置
  enum?: EnumProps[] | ((params?: any) => Promise<any>); // 枚举类型（字典）
  fieldNames?: FieldNamesProps; // 指定 label && value && children 的 key 值
  headerRender?: (scope: HeaderRenderScope<T>) => VNode; // 自定义表头内容渲染（tsx语法）
  render?: (scope: RenderScope<T>) => VNode | string; // 自定义单元格内容渲染（tsx语法）
  _children?: TableColumnProps<T>[]; // 多级表头
  el?: ComType | Component;
  elProps?: Object;
}

export type ColumnProps = Partial<TableColumnProps>;
